// import com.alibaba.druid.sql.ast.SQLExpr_ptr;
// import com.alibaba.druid.sql.ast.SQLName;
// import com.alibaba.druid.sql.ast.SQLReplaceable;
// import com.alibaba.druid.sql.visitor.SQLASTVisitor;

#include "SQLDefault.h"
#include "../../visitor/SQLASTVisitor.h"

SQLDefault::SQLDefault()
{
}

SQLDefault::SQLDefault(SQLExpr_ptr expr, SQLExpr_ptr column)
{
  this->setExpr(expr);
  this->setColumn(column);
}

SQLExpr_ptr SQLDefault::getColumn()
{
  return column;
}

void SQLDefault::setColumn(SQLExpr_ptr column)
{
  this->column = column;
}

SQLExpr_ptr SQLDefault::getExpr()
{
  return expr;
}

void SQLDefault::setExpr(SQLExpr_ptr x)
{
  if (x != nullptr)
  {
    x->setParent(SharedObject(SQLDefault));
  }
  this->expr = x;
}

// @Override
void SQLDefault::accept0(SQLASTVisitor_ptr visitor)
{
  if (visitor->visit(SharedObject(SQLDefault)))
  {
    if (SQLConstraintImpl::getName() != nullptr)
    {
      SQLConstraintImpl::getName()->accept(visitor);
    }

    if (expr != nullptr)
    {
      expr->accept(visitor);
    }
  }
  visitor->endVisit(SharedObject(SQLDefault));
}

void SQLDefault::cloneTo(SQLDefault_ptr x)
{
  SQLConstraintImpl::cloneTo(x);

  if (expr != nullptr)
  {
    x->setExpr(std::dynamic_pointer_cast<SQLExpr>(expr->clone()));
  }

  if (column != nullptr)
  {
    x->setColumn(std::dynamic_pointer_cast<SQLExpr>(column->clone()));
  }

  x->setWithValues(x->isWithValues());
}

SQLObject_ptr SQLDefault::clone()
{

  SQLObject_ptr clone_tmp = SQLDefault_ptr(new SQLDefault());
  SQLDefault_ptr x = std::dynamic_pointer_cast<SQLDefault>(clone_tmp);
  // SQLDefault x = new SQLDefault();
  cloneTo(x);
  return x;
}

// @Override
BOOL_ptr SQLDefault::replace(SQLExpr_ptr expr, SQLExpr_ptr target)
{
  if (this->expr == expr)
  {
    setExpr(target);
    return BOOL::TRUE;
  }

  if (SQLConstraintImpl::getName() == expr)
  {
    SQLConstraintImpl::setName(std::dynamic_pointer_cast<SQLName>(target));
    return BOOL::TRUE;
  }

  if (SQLConstraintImpl::getComment() == expr)
  {
    SQLConstraintImpl::setComment(target);
    return BOOL::TRUE;
  }
  return BOOL::FALSE;
}

BOOL_ptr SQLDefault::isWithValues()
{
  return withValues;
}

void SQLDefault::setWithValues(BOOL_ptr withValues)
{
  this->withValues = withValues;
}
